<?php
/**
 * MVC Framework
 *
 * @author  Мокевнин Кирилл, toxic-mt@yandex.ru
 * @version 0.2.1
 */

// Установка корневой директории
define('PATH_ROOT', str_replace('\\', '/', realpath(dirname(__FILE__))));

// Добавление корневой и models директорий в include_path
set_include_path(PATH_ROOT
               . PATH_SEPARATOR
               . PATH_ROOT . '/application/models'
               . PATH_SEPARATOR
               . get_include_path());

// Загрузка включаемых файлов
//TODO common.inc по сути хелпер. Нужно сделать подгрузку хелперов
require_once 'inc/common.php';           // Дополнительные функци

require_once 'Framework/Registry.php';         // Реестр переменных
require_once 'Framework/DbSimple/Generic.php'; // База данных
require_once 'Framework/Controller/Front.php'; // Фронт контроллер
require_once 'Framework/Session.php';          // Сессии
require_once 'Framework/Config/Ini.php';       // Конфиги
require_once 'Framework/Loader.php';           // Загрузчик классов
require_once 'Framework/Controller/Action/Helper/Broker.php'; // Работаем с хелперами
require_once 'application/plugins/Init.php';

// Загрузка конфигурации
try {
    $config   = new Framework_Config_Ini(PATH_ROOT . '/config/config.ini');
    $messages = new Framework_Config_Ini(PATH_ROOT . '/config/messages_en.ini');
} catch (Exception $e){
    // При ошибках загрузки конфигов выкидываем ошибку 500
    include 'errors/500.phtml';
    exit();
}

Framework_Registry::set('config', $config);
Framework_Registry::set('messages', $messages);

// Настройки php
ini_set('display_errors',        $config->php->display_errors);
ini_set('session.user_cookies',  $config->php->user_cookies);
ini_set('session.use_trans_sid', $config->php->use_trans_sid);
error_reporting($config->php->error_reporting);

if ($config->debug->console) { // Консоль для отладки
    require_once 'Framework/Debug/HackerConsole/Main.php';
    // Create & attach hacker console to HTML output.
    new Debug_HackerConsole_Main(true);
    // Mediator function for short call of out() method
    function debug($msg)
    {
        // Use call_user_func_array() to save caller context.
        call_user_func(array('Debug_HackerConsole_Main', 'out'), $msg);
    }
}

//Установка соединения с базой данных
$dbh = DbSimple_Generic::connect("{$config->db->adapter}://{$config->db->username}:{$config->db->password}@{$config->db->hostname}/{$config->db->dbname}");

//Устанавливаем обработчик ошибок, только если нужна база
if (is_resource($dbh->link) && $dbh instanceof DbSimple_Generic_Database) {

    // Устанавливаем префикс для таблиц
    $dbh->setIdentPrefix($config->db->prefix);
    
    // Кодировка в которой работаем с базой 
    $dbh->query('SET NAMES ' . $config->db->encode);
    
    //Установка обработчика ошибок SQL
    $dbh->setErrorHandler('databaseErrorHandler');
    
    if ($config->debug->log) {
        // Установка логирования запросов
        $dbh->setLogger('myLogger');
        /**
         * Код функции логирования запросов
         *
         * @param obj $db
         * @param string $sql
         */
        function myLogger($db, $sql)
        {
            $config = Framework_Registry::get('config');
            // Находим контекст вызова этого запроса.
            $caller = $db->findLibraryCaller();
            if ($config->debug->console) {
                debug($sql); 
            } elseif ($config->php->display_errors) {
                $tip = "at ".@$caller['file'].' line '.@$caller['line'];
                echo "<xmp title=\"$tip\">"; 
                echo $sql; 
                echo "</xmp>";
            }
        }
    }
    
    /**
     * Код обработчика ошибок SQL
     *
     * @TODO Сделать исключениями.
     * @param string $val
     * @param array $info
     * 
     */
    function databaseErrorHandler($message, $info)
    {
        $config = Framework_Registry::get('config');
        // Если использовалась @, ничего не делать.
        if (!error_reporting()) return;
        if ($config->debug->console) {
            debug("SQL Error: '{$message}'<br />\r\n");
            debug($info);
        }elseif ($config->php->display_errors) {
            echo "SQL Error: '{$message}'<br />\r\n";
            dumper($info);
        }
        //trigger_error("SQL Error: '{$message}'", E_USER_ERROR);
        exit();
    }
    // Устанавливаем соединение с базой глобальной переменной
    Framework_Registry::set('dbh', $dbh);
} else {
    // При отсутствии коннекта с базой выкидываем на 500 ошибку.
    include 'errors/500.phtml';
    exit('Try late (No base connection)');
}

// Начинаем сессию
$session = Framework_Session::getInstance();
Framework_Registry::set('session', $session);

///////////////////////////////////////////
// Только если не админка
if (strpos($_SERVER['REQUEST_URI'], 'admin') === false) {
    if ($session->offsetExists('template_dir')) { // WML or xHTML
        $config->smarty->template_dir = $session->get('template_dir');
    } else if ($session->offsetExists('css')) { // use css?
        $config->www->css = $session->get('css');
    } else if (!$session->offsetExists('change')){ // Еще не смотрели, или не нужно смотреть
        $content = @file_get_contents("http://www.noibox.com/utiles/terminales.asp?usuario=terminal&password=ternbox1415&ua=" . urlencode($_SERVER['HTTP_USER_AGENT']));
        @preg_match('[<results>(.+?)</results>]si', $content, $matches);
        $session->set('change', 1);
        // Для известного юзерагента
        if (!empty($matches[1])) {
            
            // Размер экрана
            @preg_match('[<axb>(.+?)</axb>]si', $content, $matches);
            list($width, $height) = explode('x', $matches[1]);
            $session->set('width', $width);
            
            // Поддержка css
            @preg_match('[<CSS>(.+?)</CSS>]si', $content, $matches);
            $session->set('css', $matches[1]);
            $config->www->css = $matches[1];
            $css = $matches[1];
            
            // Используемая разметка
            @preg_match('[<xhtml>(.+?)</xhtml>]si', $content, $matches);
            $xhtml = $matches[1];
            
            // Проверяем что может и не может
            if (!$xhtml) {
                header('Content-Type: text/vnd.wap.wml; charset=utf-8');
                Framework_Registry::set('smiles', false);
                $config->smarty->template_dir = 'wml';
                $session->set('template_dir', 'wml');
                ini_set('url_rewriter.tags', 'go=href');
            }
        }
    }
}
///////////////////////////////////////////
// Установка front controller и dispatch
try {
	// Регистрируем автозагрузку классов
	Framework_Loader::registerAutoload();
	
    $front = Framework_Controller_Front::getInstance();
    //$front->setBaseUrl($config->www->baseurl);
    $front->setControllerDirectory(PATH_ROOT . '/application/controllers');
    $front->registerPlugin(new My_Plugin_Init());
    
    Framework_Controller_Action_Helper_Broker::addPath(PATH_ROOT . '/application/helpers/', 'My_Action_Helper');
    Framework_Controller_Action_Helper_Broker::getStaticHelper('Init');
    
    $front->dispatch();

// Обработка ошибки контроллеров (обычно 404)
} catch (Framework_Controller_Exception $e) {
    if ($config->php->display_errors) {
        dumper($e->getMessage()); dumper($e->getCode()); dumper($e->getFile()); dumper($e->getTrace());
    }
    include 'errors/404.phtml';
// Обработка остальных ошибок
} catch (Framework_Exception $e) {
    if ($config->php->display_errors) {
        dumper($e->getMessage()); dumper($e->getCode()); dumper($e->getFile()); dumper($e->getTrace());
    }
    include 'errors/500.phtml';

} catch (Exception $e) {
    if ($config->php->display_errors) {
        dumper($e->getMessage()); dumper($e->getCode()); dumper($e->getFile()); dumper($e->getTrace());
    }
    exit('Exeption error, please, check your system.');
}